/**
 * 
 */
package org.stars.daostars.pipeline;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * Rappresenta una pipeline di operazioni sql da eseguire.
 * I vantaggi di utilizzare una pipeline piuttosto che una
 * sequenza semplice di sql:
 * <ul>
 * 		<li>Dichiarazione a livello di xml della sequenza di codice sql da eseguire</li>
 * 		<li>Performance: tutte le query della pipeline utilizzano la stessa conessione</li>
 * </ul> 
 *
 * @author Francesco Benincasa (908099)
 * @date 21/nov/07, 11:03:15
 *
 */
public class DaoPipeline implements Serializable {
	
	/**
	 * indica se utilizzare o meno l'elemento.
	 * Normalmente è posto a true. Se false deve essere scartato.
	 */
	protected boolean enabled;
	
	/**
	 *	Tipo di connessione utilizzata dalla pipeline.
	 *
	 * @author Francesco Benincasa (908099)
	 * @date 21/nov/07, 11:08:50
	 *
	 */
	public enum TypeConnection 
	{
		SHARED_CONNNECTION,
		TRANSACTION,
	};
	
	public DaoPipeline()
	{
		pipeline=new ArrayList<DaoPipelineElement>();
		typeConnection=TypeConnection.SHARED_CONNNECTION;
		enabled=true;
	}
	
	/**
	 * Getter dell'attributo enabled
	 * @return the enabled
	 */
	public boolean isEnabled() {
		return enabled;
	}

	/**
	 * Setter dell'attributo enabled
	 * @param enabled the enabled to set
	 */
	public void setEnabled(boolean enabled) {
		this.enabled = enabled;
	}
	
	/**
	 * tipo di connessione utilizzata
	 */
	protected TypeConnection typeConnection;
	
	/**
	 * array di elementi sql da eseguire
	 */
	protected ArrayList<DaoPipelineElement> pipeline;
	
	/**
	 * Serial id.
	 */
	private static final long serialVersionUID = -5399087230828430921L;
	
	/**
	 * Nome della pipeline.
	 */
	protected String name;

	/**
	 * Getter dell'attributo name
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * Setter dell'attributo name
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Getter dell'attributo typeConnection
	 * @return the typeConnection
	 */
	public TypeConnection getTypeConnection() {
		return typeConnection;
	}

	/**
	 * Setter dell'attributo typeConnection
	 * @param typeConnection the typeConnection to set
	 */
	public void setTypeConnection(TypeConnection typeConnection) {
		this.typeConnection = typeConnection;
	}

	/**
	 * Getter dell'attributo pipeline
	 * @return the pipeline
	 */
	public ArrayList<DaoPipelineElement> getPipeline() {
		return pipeline;
	}

	/**
	 * Setter dell'attributo pipeline
	 * @param pipeline the pipeline to set
	 */
	public void setPipeline(ArrayList<DaoPipelineElement> pipeline) {
		this.pipeline = pipeline;
	}
	
	/**
	 * Aggiunge un elemento alla pipeline.
	 * 
	 * @param item
	 */
	public void add(DaoPipelineElement item)
	{
		item.setQueryName(item.getQueryName().toUpperCase());
		pipeline.add(item);
	}
	
	/**
	 * size della pipeline.
	 * 
	 * @return
	 * 		size della pipeline
	 */
	public int size()
	{
		return pipeline.size();
	}
}
